package com.hsj.dom4j;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

import java.io.*;
import java.util.List;

/**
 * @author:Teacher黄
 * @date:Created at 2019/05/08
 */
public class Dom4jTest {


    /**
     * 读取XML文件
     */
    @Test
    public void read() throws DocumentException {
        // 读取资源文件
        InputStream inputStream = Dom4jTest.class.getClassLoader().getResourceAsStream("my.xml");
        // 得到解析器
        SAXReader reader = new SAXReader();
        // 加载资源
        Document document = reader.read(inputStream);
        // 获取根节点
        Element rootElement = document.getRootElement();
        // 获取子节点
        List<Element> student = rootElement.elements("student");
        // 遍历子节点
        for (Element element : student) {
            // 在获取子节点
            List<Element> elements = element.elements();
            for (Element element1 : elements) {
                // 获取标签名字
                String elementName = element1.getName();
                // 获取标签中的文字
                String content = element1.getText();
                System.out.println(elementName+":"+content);
            }
        }
    }

    /**
     * 创建XML文件
     */
    @Test
    @SuppressWarnings("all")
    public void create() throws IOException {
        // 创建文档
        Document document = DocumentHelper.createDocument();
        // 添加根元素
        Element root = document.addElement("root");
        // 添加子元素,添加属性,添加文本值
        Element element = root.addElement("car").addAttribute("logo", "奔驰").addText("奔驰A-class");

        // 通过输出流创建文件
        FileWriter fileWriter = new FileWriter("D:\\gitee\\dom4j\\config\\root.xml");
        document.write(fileWriter);
        fileWriter.close();
    }

    /**
     * 格式化输出到文件
     * @throws IOException
     */
    @Test
    @SuppressWarnings("all")
    public void createFormat() throws IOException {
        // 创建文档
        Document document = DocumentHelper.createDocument();
        // 添加根元素
        Element root = document.addElement("root");
        // 添加子元素,添加属性,添加文本值
        Element element = root.addElement("car").addAttribute("logo", "奔驰").addText("奔驰A-class");
        // 文件流
        FileWriter fileWriter = new FileWriter("D:\\gitee\\dom4j\\config\\root1.xml");
        // 格式化输出
        OutputFormat outputFormat = new OutputFormat();
        // 设置缩进
        outputFormat.setIndent(true);
        // 设置换行
        outputFormat.setNewlines(true);
        XMLWriter xmlWriter = new XMLWriter(fileWriter,outputFormat);
        xmlWriter.write(document);
        fileWriter.close();
        xmlWriter.close();
    }

    /**
     * xml文件转换成String
     */
    @Test
    public void xmlToStr() throws DocumentException {
        // 读取资源文件
        InputStream inputStream = Dom4jTest.class.getClassLoader().getResourceAsStream("my.xml");
        // 得到解析器
        SAXReader reader = new SAXReader();
        // 加载资源
        Document document = reader.read(inputStream);
        // 转换成str
        String xml = document.asXML();

        System.out.println(xml);
    }

    /**
     * 字符串转换成XML
     */
    @Test
    public void strToXml() throws DocumentException {
        String xml = "<root><car logo=\"奔驰\">奔驰A-class</car></root>";
        // 转换
        Document document = DocumentHelper.parseText(xml);
    }

    /**
     * 添加节点
     */
    @Test
    public void addNode() throws DocumentException, IOException {
        // 读取资源文件
        InputStream inputStream = Dom4jTest.class.getClassLoader().getResourceAsStream("my.xml");
        // 得到解析器
        SAXReader reader = new SAXReader();
        // 加载资源
        Document document = reader.read(inputStream);
        // 获取根节点
        Element rootElement = document.getRootElement();
        // 获取student子节点
        List<Element> studentList = rootElement.elements("student");
        // 获取子节点的第一个,指定节点加入
        Element student = studentList.get(0);
        // 在当前节点添加子节点
        student.addElement("height").setText("180cm");
        // 创建一个新的节点
        Element gxa = DocumentHelper.createElement("gxa");
        gxa.addAttribute("desc","央企办学").setText("军工品质");
        // 添加到第一个student节点之后
        studentList.add(1,gxa);

        // 格式化
        OutputFormat prettyPrint = OutputFormat.createPrettyPrint();
        prettyPrint.setEncoding("UTF-8");
        XMLWriter xmlWriter = new XMLWriter(new FileWriter("D:\\gitee\\dom4j\\config\\my.xml"), prettyPrint);
        xmlWriter.write(document);
        xmlWriter.close();
    }


    /**
     * 删除节点
     */
    @Test
    public void delete() throws DocumentException, IOException {
        // 读取资源文件
        InputStream inputStream = Dom4jTest.class.getClassLoader().getResourceAsStream("my.xml");
        // 得到解析器
        SAXReader reader = new SAXReader();
        // 加载资源
        Document document = reader.read(inputStream);
        // 获取根节点
        Element rootElement = document.getRootElement();
        // 获取 gxa节点
        Element gxa = rootElement.element("gxa");
        // 通过父级删除自己
        gxa.getParent().remove(gxa);

        // 格式化
        OutputFormat prettyPrint = OutputFormat.createPrettyPrint();
        prettyPrint.setEncoding("UTF-8");
        XMLWriter xmlWriter = new XMLWriter(new FileWriter("D:\\gitee\\dom4j\\config\\my.xml"), prettyPrint);
        xmlWriter.write(document);
        xmlWriter.close();

    }
}
